/*
 *    Copyright © OpenAtom Foundation.
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

package com.inspur.edp.bff.api.manager;

import com.inspur.edp.bef.api.lcp.IStandardLcp;
import com.inspur.edp.bff.api.dataprocessor.IChangeConvertor;
import com.inspur.edp.bff.api.dataprocessor.IDataConvertor;
import com.inspur.edp.bff.api.dataprocessor.IDefaultValueConvertor;
import com.inspur.edp.bff.api.dataprocessor.IEntityPropertyMapper;
import com.inspur.edp.bff.api.dataprocessor.IFilterFieldConvertor;
import com.inspur.edp.bff.api.extend.IBffManagerExtend;
import com.inspur.edp.bff.api.manager.assembler.IAssemblerManager;
import com.inspur.edp.bff.api.manager.assembler.IChangeMapperAssembler;
import com.inspur.edp.bff.api.manager.assembler.IDataMapperAssembler;
import com.inspur.edp.bff.api.manager.assembler.IExtendDeleteAssembler;
import com.inspur.edp.bff.api.manager.assembler.IExtendModifyAssembler;
import com.inspur.edp.bff.api.manager.assembler.IExtendQueryAssembler;
import com.inspur.edp.bff.api.manager.assembler.IExtendRetrieveAssembler;
import com.inspur.edp.bff.api.manager.assembler.IExtendRetrieveDefaultAssembler;
import com.inspur.edp.cef.entity.changeset.IChangeDetail;
import com.inspur.edp.cef.entity.entity.ICefData;
import com.inspur.edp.cef.entity.entity.IEntityData;
import com.inspur.edp.cef.spi.entity.resourceInfo.ModelResInfo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * FSManager管理类上下文接口
 */
public interface IFSManagerContext {
    /**
     * 获取当前的FSManager管理类实例
     *
     * @return FSManager管理类实例
     * @see IFSManager
     */
    IFSManager getBffManager();

    /**
     * 获取当前视图对象主表的数据源类型:{@link SourceType#Be},{@link SourceType#Qo}。
     *
     * @return 当前视图对象主表的数据源类型
     * @see SourceType
     */
    SourceType getMainSourceType();

    /**
     * 获取扩展动作管理类实例
     *
     * <ul><li>vo上扩展动作目前有：新增前，新增，新增后，检索前，检索，检索后，查询前，查询，查询后，修改前，修改，修改后，数据Mapping，数据反向mapping，变更集Mapping，变更集反向Mapping，
     * 删除前/批量删除前，删除/批量删除，删除后/批量删除后，保存前，保存后等）；分为8大类：新增，检索，查询，修改，数据Mapping，变更集Mapping，删除，保存等，23个动作。
     * <li>新增管理类{@link IExtendRetrieveDefaultAssembler}；
     * <li>检索管理类{@link IExtendRetrieveAssembler}；
     * <li>查询管理类{@link IExtendQueryAssembler}；
     * <li>修改管理类{@link IExtendModifyAssembler}
     * <li>删除管理类{@link IExtendDeleteAssembler}；
     * <li>变更集管理类{@link IChangeMapperAssembler}；
     * <li>数据映射管理类{@link IDataMapperAssembler}；</ul>
     *
     * @return 返回扩展动的管理器实例
     * @see IAssemblerManager
     */

    IAssemblerManager getAssemblerManager();

    /**
     * 判断保存状态，是否是保存前状态
     *
     * @return
     */
    boolean getIsBeforeSaving();

    /**
     * 获取BEF 的Lcp（Local Consumer Proxy，本地消费者代理），通常说的{@link IStandardLcp}
     * <p> 这里说的lcp指的是根据后端BE创建的VO才会获取到，虚拟VO是没有其对应的lcp的，虚拟VO的逻辑需要开发人员按照VO上的扩展动作实现其CURD
     *
     * @return 得到的BE的LCP <see cref="IStandardLcp"/>
     */
    IStandardLcp getLcp();

    /**
     * 获取一组lcp的实例，key对应的是be的功能标识：configid，详情可参考{@link IFSManagerFactory}介绍；value对应的是vo对应的be的本地服务代理lcp:{@link IStandardLcp}。
     * <p> 通常该方法会在组合vo中应用，组合vo中由多个vo组装而成，每个vo对应的be是不同的，因此在这种情况，会根据不同的vo取对应的be实现CURD。
     *
     * @return
     */
    HashMap<String, IStandardLcp> getLcps();

    /**
     * 是否启用权限
     *
     * @param useAuth 启用权限参数
     */
    void setUseAuth(boolean useAuth);

    /**
     * 获取一组数据源的配置信息，数据源类型包括：{@link SourceType#Be},{@link SourceType#Qo}
     *
     * @return 一组数据源的配置信息
     */
    ArrayList<SourceConfig> getSourceConfigs();

    /**
     * 获取变更集转换器，将vo变更集转换为be变更集
     *
     * @return 得到的变更转换器实例。
     * @see IChangeDetail
     */
    IChangeConvertor getChangeConvertor();

    /**
     * @return
     */
    IEntityPropertyMapper getRootEntityPropertyMapper();

    /**
     * 获取数据转换器，将vo数据转换为be数据。
     *
     * @return 得到的数据转换器
     * @see IDataConvertor
     */
    IDataConvertor getDataConvertor();

    /**
     * 过滤条件转换器
     *
     * @return 当前vo上的过滤条件转换器
     * @see IFilterFieldConvertor
     */
    IFilterFieldConvertor getFilterConvertor();

    /**
     * 获取默认值转换器
     *
     * @return 当前vo上的默认值转换器
     * @see IDefaultValueConvertor
     */
    IDefaultValueConvertor getDefaultValueConvertor();

    /**
     * 执行自定义操作，返回操作执行结果。
     *
     * @param action 要执行的操作实例
     * @return 得到的操作执行结果
     */
    <TResult> TResult executeAction(IFSAction<TResult> action);

    /**
     * 执行自定义操作，返回操作执行结果。
     *
     * @param action     执行的动作类实例
     * @param actionId   动作id
     * @param actionCode 动作编号
     * @param parameters 参数
     * @param autoSave   是否自动保存
     * @param <TResult>  得到的操作执行结果
     * @return
     */
    <TResult> TResult executeAction(IFSAction<TResult> action, String actionId, String actionCode
            , Map<String, Object> parameters, boolean autoSave);

    /**
     * 执行自定义操作，返回操作执行结果。
     *
     * @param action     执行的动作类实例
     * @param actionId   动作id
     * @param actionCode 动作编号
     * @param parameters 参数
     * @param <TResult>  得到的操作执行结果
     * @return
     */
    <TResult> TResult executeAction(IFSAction<TResult> action, String actionId, String actionCode
            , Map<String, Object> parameters);

    void processResponse();

    /**
     * 创建新的视图对象主对象实体数据实例。
     *
     * @return 新的视图对象实体数据实例
     * @see IEntityData
     */
    IEntityData createData();

    /**
     * 新的视图对象子对象实体数据实例
     *
     * @param objectCode 子对象编号
     * @return 得到的视图对象子对象实体数据实例
     */
    IEntityData createData(String objectCode);

    /**
     * 获取与BE对应的VM对象编号。
     *
     * @param beObjectCode BE对象编号
     * @return 得到的VM对象编号
     */
    String getVMCodeFromBE(String beObjectCode);

    /**
     * 获取与VM对应的BE对象编号
     *
     * @param vmObjectCode VM对象编号
     * @return 对应的BE对象编号
     */
    String getBECodeFromVM(String vmObjectCode);

    /**
     * 获取vo元数据id
     *
     * @return
     */
    String getVoId();

    /**
     * @param value
     */
    void setVoId(String value);

    /**
     * 获取变量实体数据
     *
     * @return 当前vo上的变量实体数据
     * @see ICefData
     */
    ICefData getVariableData();

    /**
     * 获取变量内部变更
     *
     * @return
     * @see IChangeDetail
     */
    IChangeDetail getVariableInnerChange();

    /**
     * 获取与VM对应的前端编号
     *
     * @param frontVoCode
     * @return 得到的VM对象编号
     */
    String getVoCode(String frontVoCode);

    /**
     * 国际化资源项
     *
     * @return
     * @see ModelResInfo
     */
    ModelResInfo getModelResourceInfo();

    /**
     * 翻译后的实体名称
     *
     * @param nodeCode 视图对象节点编号
     * @return 国际化实体名称
     */
    String getEntityI18NName(String nodeCode);

    /**
     * 翻译后的属性名称
     *
     * @param nodeCode 视图对象节点编号
     * @param labelID  属性字段的标签
     * @return 国际化属性名称
     */
    String getPropertyI18NName(String nodeCode, String labelID);

    /**
     * 翻译后的关联带出字段名称
     *
     * @param nodeCode   视图对象节点编号
     * @param labelID    属性字段的标签
     * @param refLabelID 关联属性字段的标签
     * @return 国际化关联带出字段名称
     */
    String getRefPropertyI18NName(String nodeCode, String labelID, String refLabelID);

    /**
     * 翻译后的枚举显示值
     *
     * @param nodeCode 视图对象节点编号
     * @param labelID  属性字段的标签
     * @param enumKey  枚举值
     * @return 国际化枚举值
     */
    String getEnumValueI18NDisplayName(String nodeCode, String labelID, String enumKey);

    /**
     * 翻译后的唯一性约束提示信息
     *
     * @param conCode  视图对象节点编号
     * @param nodeCode 唯一性约束编号
     * @return
     */
    String getUniqueConstraintMessage(String nodeCode, String conCode);

    /**
     * 获取VO运行时定制扩展接口类
     *
     * @return
     * @see IBffManagerExtend
     */
    List<IBffManagerExtend> getExtList();
}
